#include <bits/stdc++.h>
using namespace std;

const int N=1e6+10;
using ll=long long;
ll dp[N];
ll n;
// int main()
// {
//     ios::sync_with_stdio(false);
//     cin.tie(nullptr);
//     cin>>n;
//     dp[0]=0,dp[1]=1;
//     int index=0;
//     for(int i=2;i<=N;i++)
//     {
//         dp[i]=dp[i-1]+dp[i-2];
//         if(dp[i]>n)
//         {
//             index=i;
//             break;
//         }
//     }
//     cout<<((n-dp[index-1])<(dp[index]-n)?(n-dp[index-1]):(dp[index]-n))<<endl;
//     return 0;
// }

class Solution 
{
    int m,n;
    bool vis[101][101]={0};
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
public:
    bool exist(vector<string>& board, string word) 
    {
        m=board.size(),n=board[0].size();
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(board[i][j]==word[0])
                {
                    if(dfs(board,word,i,j,0))return true;
                }
            }
        }
        return false;
    }
    bool dfs(vector<string>&board,string word,
                        int i,int j,int pos)
    {
        if(pos==word.size()-1)return true;
        vis[i][j]=true;
        for(int k=0;k<4;k++)
        {
            int a=i+dx[k],b=j+dy[k];
            if(a>=0&&a<m&&b>=0&&b<n&&!vis[a][b]&&
                            board[a][b]==word[pos+1])
            if(dfs(board,word,a,b,pos+1))return true;        
        }
        vis[i][j]=false;
        return false;
    }

};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n;
    int a[n][n];
    a[0][0]=a[1][0]=1;
    for(int i=1;i<n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            a[i][0]=1;
            if(i==j)a[i][j]=1;
            else a[i][j]=a[i-1][j-1]+a[i-1][j];
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            //设置输出域宽为5
            // cout<<setw(5)<<a[i][j]<<" ";
            printf("%5d",a[i][j]);
        }
        // cout<<endl;
        printf("\n");
    }
    return 0;
}